home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 17
/
CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso
/
CUCD
/
Programming
/
DiceSource
/
lib
/
time
/
localtime.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-09-09
|
2KB
|
65 lines
/*
* time/localtime.c
*
* (c)Copyright 1992-1997 Obvious Implementations Corp. Redistribution and
* use is allowed under the terms of the DICE-LICENSE FILE,
* DICE-LICENSE.TXT.
*/
#include <time.h>
#include <lib/misc.h>
static char dim[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
struct tm *
localtime(tp)
const time_t *tp;
{
static struct tm Tm;
return(localtime_tm(tp, &Tm));
}
struct tm *
localtime_tm(tp, tm)
const time_t *tp;
struct tm *tm;
{
time_t t = (tp) ? *tp : time(NULL); /* seconds since 1-jan-78 */
long days, years;
short leap, month;
t = t - _TimeCompensation;
days = t / 86400 + 731; /* days since 1976 (lyp yr)*/
tm->tm_wday = (days + 4) % 7;
tm->tm_sec = t % 60;
tm->tm_min = t / 60 % 60;
tm->tm_hour= t / (60*60) % 24;
years = days / (366+365*3); /* #quad yrs */
days -= years * (366+365*3); /* days remaining */
/* 0 = jan 1 */
leap = (days <= 365); /* 0-365, is a leap yr */
years = 1976 + 4 * years; /* base yr */
if (leap == 0) { /* days >= 366 */
days -= 366; /* add a year */
++years;
years += days / 365; /* non-lyrs left */
days %= 365; /* 0-364 */
}
tm->tm_yday = days;
tm->tm_year = years - 1900;
tm->tm_isdst= -1; /* ???? XXX */
for (month = 0; (month==1) ? (days >= 28 + leap) : (days >= dim[month]); ++month)
days -= (month==1) ? (28 + leap) : dim[month];
tm->tm_mon = month;
tm->tm_mday = days + 1;
return(tm);
}